package com.mastercard.assets.notifications;

import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityTransaction;

import com.mastercard.assets.MasterCardException;
import com.mastercard.assets.jpa.TblAgencia;
import com.mastercard.assets.jpa.TblAlerta;
import com.mastercard.assets.jpa.TblAsset;
import com.mastercard.assets.jpa.TblCampania;
import com.mastercard.assets.jpa.TblCuenta;
import com.mastercard.assets.jpa.TblNivel;
import com.mastercard.assets.jpa.TblNotificacion;
import com.mastercard.assets.jpa.TblPaises;
import com.mastercard.assets.jpa.TblRole;
import com.mastercard.assets.jpa.TblTipoCuenta;
import com.mastercard.assets.jpa.TblUsuario;
import com.mastercard.assets.util.MCUtil;
import com.mastercard.assets.util.dao.MasterCardDAO;
import com.mastercard.assets.web.util.to.UserLogin;

public class NotificationUtil
{    
    public static void throwNotificationTypeToCountType( int numPaq , TblAsset asset , int tipoHabitacion , int cveCountType )
		throws
			MasterCardException
	{
		System.out.println( "ThrowNotificationTypeCount" ) ;
		// averigua el tipoCuenta
		TblTipoCuenta tipoCuenta = MasterCardDAO.findCountTypeById( cveCountType ) ;
		
		// en caso de que no exista
		if( tipoCuenta == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.notification.errors.CountTypeNotExist" , cveCountType ) ,
					MCUtil.MASTERCARD_ERROR_CODE_NOTIFICATION_COUNT_TYPE_NOT_EXIST , 
					null ) ;
		
		// tipo de habitacion
		String habitacion = "" ;
		
		if( tipoHabitacion == 1 )
			habitacion = "Sencilla" ;
		else
			habitacion = "Doble" ;
		
		System.out.println( "ThrowNotificationTypeCount: " + habitacion ) ;
		Timestamp fechaProlongada = new Timestamp( System.currentTimeMillis( ) + ( 1000 * 60 * 60 * 24 * 365 ) ) ;
		
		// verifica si el tipo de cuenta tiene varias cuentas o una sola
		List< TblCuenta > cuentas = new ArrayList< TblCuenta >( ) ;
		List< TblCuenta > cuentasHermanas = tipoCuenta.getTblCuentas( ) ;
		
		for( TblCuenta c : cuentasHermanas )
			if( c.getStatus( ) == 1 )
				cuentas.add( c ) ;
		
                
		System.out.println( "ThrowNotificationTypeCount: cuentas " + cuentas.size( ) ) ;
		// en caso de que tenga mas de una cuenta
		if( cuentas.size( ) > 1 )
		{
			// busca las Notificaciones para NKA
			List< TblNotificacion > notis = MasterCardDAO.getAllActiveNotificationsByTipoNotificacion( 2 ) ;
                        
			
			System.out.println( "ThrowNotificationTypeCount: notis " + notis.size( ) ) ;
			// recorre las notificaciones
			for( TblNotificacion noti : notis )
			{
				
                            //validar notificacion activa
                            if ( noti.getStatus() == 0 )
                                    continue ;
                            
                                // toma los datos				
				int tipo = noti.getTipo( ) ;
				
				// alerta
				TblAlerta alerta = noti.getTblAlerta( ) ;
				// mensaje de la alerta
				String texto = alerta.getTexto( ) ;
				
				String nombre = alerta.getNombre( ) ;
				
				texto = texto.replaceAll( "<Num_Paq>" , "" + numPaq ) ;
				texto = texto.replaceAll( "<Room_Type>" , "" + habitacion ) ;
				texto = texto.replaceAll( "<Asset_Name>" , "" + asset.getNombre( ) ) ;
                                texto = texto.replaceAll( "<Count_Name_Origin>" , "" ) ;
                                texto = texto.replaceAll( "<Room_Type>" , "" ) ;
                                texto = texto.replaceAll( "<Count_Name>" , "" ) ;
				
				// toma el rol
				TblRole role = noti.getTblRole( ) ;
				// toma el nivel
				TblNivel nivel = noti.getTblNivel( ) ;
				
				int cveRole = role.getCveRole( ) ;
                                List< TblUsuario > usuariosRec = new ArrayList< TblUsuario >( ) ;
                                
                               if( role.getCveRole( ) == 5 || role.getCveRole( ) == 2 || role.getCveRole( ) == 6 || role.getCveRole( ) == 7
                                       || role.getCveRole( ) == 8 )
                                {
                                    List< TblUsuario > usuarios = noti.getTblRole( ).getTblUsuarios( ) ;
                                    
                                    for( TblUsuario us : usuarios )
                                    {
                                        if( us.getStatus( ) == 0 )
                                            continue ;
                                        
                                        if( role.getCveRole( ) == 5 || role.getCveRole( ) == 2 ) {
                                            
                                            if( us.getTblPais( ) != asset.getTblPais( ) )
                                                continue ;
                                            
                                        }
                                        
                                        if( role.getCveRole( ) == 5 ) {
                                            
                                            if( us.getTblTipoCuentas( ).get( 0 ) != tipoCuenta )
                                                continue ;
                                            
                                        }                                        
                                        
                                        boolean yaEsta = false ;
                                        if( usuariosRec.isEmpty( ) )
                                        {
                                            usuariosRec.add( us ) ;
                                        }else
                                        {
                                            for( TblUsuario usRec : usuariosRec )
                                            {
                                                if( usRec.getCveUsuario( ) == us.getCveUsuario( ) )
                                                {
                                                    yaEsta = true ;
                                                }
                                            }
                                            
                                            if( yaEsta == false )
                                            {
                                               usuariosRec.add( us ) ; 
                                            }
                                        }
                                    }
                                }else
                                {
                                    if( role.getCveRole( ) == 4 )
                                        continue ;
                                    
                                    for( TblCuenta c : cuentas )
                                    {
                                        if( c.getStatus( ) == 0 )
                                            continue ;

                                        List< TblUsuario > usuarios = c.getTblUsuarios( ) ;

                                        for( TblUsuario us : usuarios )
                                        {
                                            if( us.getStatus( ) == 0 )
                                                continue;
                                            
                                            if( us.getTblPais( ) != asset.getTblPais( ) )
                                                continue ;

                                            boolean yaEsta = false ;
                                            if( usuariosRec.isEmpty( ) )
                                            {
                                                usuariosRec.add( us ) ;
                                            }else
                                            {
                                                for( TblUsuario usRec : usuariosRec )
                                                {
                                                    if( usRec.getCveUsuario( ) == us.getCveUsuario( ) )
                                                    {
                                                        yaEsta = true ;
                                                    }
                                                }

                                                if( yaEsta == false )
                                                {
                                                   usuariosRec.add( us ) ; 
                                                }
                                            }
                                        }
                                    }
                                }
					
					// recorre los usuarios
					for( TblUsuario us : usuariosRec )
					{
						// en caso de que no este activo
						if( us.getStatus( ) == 0 )
							continue ;
						
						// revisa los roles
						List< TblRole > roles = us.getTblRoles( ) ;
						
						boolean tieneRole = false ;
						
						for( TblRole r : roles )
						{
							if( r.getStatus( ) == 0 )
								continue ;
							
//							System.out.println( "ThrowNotificationTypeCount: cuenta " + c.getNombre( ) ) ;
							// en caso de que tenga el mismo rol
							if( r.getCveRole( ) == cveRole )
							{
								tieneRole = true ;
								
								break ;
							}
						}
						
						// en caso de que este en false
						if( ! tieneRole )
							continue ;
						else
						{
							// en caso de que nivel sea null
							if( nivel == null )
							{
								
                                                            
                                                                System.out.println( "ThrowNotificationTypeCount: Agrega sin nivelregistro " + alerta.getCveAlerta( ) + " - " + us.getCveUsuario( ) + " - " + nombre ) ;
								// en caso de que sea de tipo 1 (Pantalla) o 3 (ambos)
								if( tipo == 1 || tipo == 3 )
									// agrega la alerta
									MasterCardDAO.saveNewAlertByUser( alerta , us , nombre , texto , fechaProlongada , fechaProlongada , fechaProlongada , noti, null ) ;
                                                                
								// en caso de que sea de tipo 2 (correo) o 3 (ambos)
								if( tipo == 2 || tipo == 3 )
									MCUtil.sendMailForNotification( us.getEmail( ) , alerta.getNombre( ) , texto ) ;
							}
							// en caso de que no sea null
							else
							{
								int cveNivel = nivel.getCveNivel( ) ;
								
								// recorre los niveles
								List< TblNivel > niveles = us.getTblNivels( ) ;
								
								boolean tieneNivel = false ;
								
								for( TblNivel ni : niveles )
								{
									if( ni.getStatus( ) == 0 )
										continue ;
									
									if( ni.getCveNivel( ) == cveNivel )
									{
										tieneNivel = true ;
										
										break ;
									}
								}
								
								if( tieneNivel )
								{
									System.out.println( "ThrowNotificationTypeCount: Agrega registro " + alerta.getCveAlerta( ) + " - " + us.getCveUsuario( ) + " - " + nombre + " tipo: " + tipo ) ;
									// en caso de que sea de tipo 1 (Pantalla) o 3 (ambos)
									if( tipo == 1 || tipo == 3 )
										// agrega la alerta
										MasterCardDAO.saveNewAlertByUser( alerta , us , nombre , texto , fechaProlongada , fechaProlongada , fechaProlongada , noti, null ) ;
                                                                                
									// en caso de que sea de tipo 2 (correo) o 3 (ambos)
									if( tipo == 2 || tipo == 3 )
										MCUtil.sendMailForNotification( us.getEmail( ) , alerta.getNombre( ) , texto ) ;
								}

							}
						}
					}
//				}
			}
		}
		// en caso de que tenga 0 o 1 cuenta
		else
		{
			// busca las Notificaciones para NKA
			List< TblNotificacion > notis = MasterCardDAO.getAllActiveNotificationsByTipoNotificacion( 1 ) ;
                        
			
			System.out.println( "ThrowNotificationTypeCount: notis " + notis.size( ) ) ;
			// recorre las notificaciones
			for( TblNotificacion noti : notis )
			{
				
                            //validar notificacion activa
                            if ( noti.getStatus() == 0 )
                                    continue ;
                            
                                // toma los datos
				int tipo = noti.getTipo( ) ;				
                                                                
				// alerta
				TblAlerta alerta = noti.getTblAlerta( ) ;
				// mensaje de la alerta
				String texto = alerta.getTexto( ) ;
				
				String nombre = alerta.getNombre( ) ;
				
				texto = texto.replaceAll( "<Num_Paq>" , "" + numPaq ) ;
				texto = texto.replaceAll( "<Room_Type>" , "" + habitacion ) ;
				texto = texto.replaceAll( "<Asset_Name>" , "" + asset.getNombre( ) ) ;
                                texto = texto.replaceAll( "<Campaign_Name>" , "" ) ;
                                texto = texto.replaceAll( "<Count_Name_Origin>" , "" ) ;
                                texto = texto.replaceAll( "<Count_Name>" , "" ) ;
                                
				// toma el rol
				TblRole role = noti.getTblRole( ) ;
				// toma el nivel
				TblNivel nivel = noti.getTblNivel( ) ;
				
				int cveRole = role.getCveRole( ) ;
                                List< TblUsuario > usuariosRec = new ArrayList< TblUsuario >( ) ;
                                
                                if( role.getCveRole( ) == 5 || role.getCveRole( ) == 2 || role.getCveRole( ) == 6 || role.getCveRole( ) == 7
                                       || role.getCveRole( ) == 8 )
                                {
                                    List< TblUsuario > usuarios = noti.getTblRole( ).getTblUsuarios( ) ;
                                    
                                    for( TblUsuario us : usuarios )
                                    {
                                        if( us.getStatus( ) == 0 )
                                            continue ;
                                        
                                        if( role.getCveRole( ) == 5 || role.getCveRole( ) == 2 ) {
                                            
                                            if( us.getTblPais( ) != asset.getTblPais( ) )
                                                continue ;
                                            
                                        }
                                        
                                        if( role.getCveRole( ) == 5 ) {
                                            
                                            if( us.getTblTipoCuentas( ).get( 0 ) != tipoCuenta )
                                                continue ;
                                            
                                        }
                                        
                                        boolean yaEsta = false ;
                                        if( usuariosRec.isEmpty( ) )
                                        {
                                            usuariosRec.add( us ) ;
                                        }else
                                        {
                                            for( TblUsuario usRec : usuariosRec )
                                            {
                                                if( usRec.getCveUsuario( ) == us.getCveUsuario( ) )
                                                {
                                                    yaEsta = true ;
                                                }
                                            }
                                            
                                            if( yaEsta == false )
                                            {
                                               usuariosRec.add( us ) ; 
                                            }
                                        }
                                    }
                                }else
                                {
                                    if( role.getCveRole( ) == 4 )
                                        continue ;
                                    
                                    for( TblCuenta c : cuentas )
                                    {
                                        if( c.getStatus( ) == 0 )
                                            continue ;

                                        List< TblUsuario > usuarios = c.getTblUsuarios( ) ;

                                        for( TblUsuario us : usuarios )
                                        {
                                            if( us.getStatus( ) == 0 )
                                                continue;
                                            
                                            if( us.getTblPais( ) != asset.getTblPais( ) )
                                                continue ;

                                            boolean yaEsta = false ;
                                            if( usuariosRec.isEmpty( ) )
                                            {
                                                usuariosRec.add( us ) ;
                                            }else
                                            {
                                                for( TblUsuario usRec : usuariosRec )
                                                {
                                                    if( usRec.getCveUsuario( ) == us.getCveUsuario( ) )
                                                    {
                                                        yaEsta = true ;
                                                    }
                                                }

                                                if( yaEsta == false )
                                                {
                                                   usuariosRec.add( us ) ; 
                                                }
                                            }
                                        }
                                    }
                                }
				
				System.out.println( "ThrowNotificationTypeCount: Agrega cveRole " + cveRole ) ;
					
//					System.out.println( "ThrowNotificationTypeCount: usuarios " + usuarios.size( ) ) ;
					// recorre los usuarios
					for( TblUsuario us : usuariosRec )
					{
						// en caso de que no este activo
						if( us.getStatus( ) == 0 )
							continue ;
						
						// revisa los roles
						List< TblRole > roles = us.getTblRoles( ) ;
						
						boolean tieneRole = false ;
						
						System.out.println( "ThrowNotificationTypeCount: roles " + roles.size( ) ) ;
						for( TblRole r : roles )
						{
							if( r.getStatus( ) == 0 )
								continue ;
							
							System.out.println( "ThrowNotificationTypeCount: comparacion " + r.getCveRole( ) + " - " + cveRole ) ;
							// en caso de que tenga el mismo rol
							if( r.getCveRole( ) == cveRole )
							{
								tieneRole = true ;
								
								break ;
							}
						}
						
						System.out.println( "ThrowNotificationTypeCount: tieneRole " + tieneRole ) ;
						// en caso de que este en false
						if( ! tieneRole )
							continue ;
						else
						{
							// en caso de que nivel sea null
							if( nivel == null )
							{
								System.out.println( "ThrowNotificationTypeCount: Agrega registro " + alerta.getCveAlerta( ) + " - " + us.getCveUsuario( ) + " - " + nombre ) ;
								// en caso de que sea de tipo 1 (Pantalla) o 3 (ambos)
								if( tipo == 1 || tipo == 3 )
									// agrega la alerta
									MasterCardDAO.saveNewAlertByUser( alerta , us , nombre , texto , fechaProlongada , fechaProlongada , fechaProlongada , noti , null ) ;
                                                                        
								// en caso de que sea de tipo 2 (correo) o 3 (ambos)
								if( tipo == 2 || tipo == 3 )
									MCUtil.sendMailForNotification( us.getEmail( ) , alerta.getNombre( ) , texto ) ;
							}
							// en caso de que no sea null
							else
							{
								int cveNivel = nivel.getCveNivel( ) ;
								
								// recorre los niveles
								List< TblNivel > niveles = us.getTblNivels( ) ;
								
								boolean tieneNivel = false ;
								
								for( TblNivel ni : niveles )
								{
									if( ni.getStatus( ) == 0 )
										continue ;
									
									if( ni.getCveNivel( ) == cveNivel )
									{
										tieneNivel = true ;
										
										break ;
									}
								}
								
								System.out.println( "ThrowNotificationTypeCount: Agrega registro " + alerta.getCveAlerta( ) + " - " + us.getCveUsuario( ) + " - " + nombre ) ;
								if( tieneNivel )
								{
									// en caso de que sea de tipo 1 (Pantalla) o 3 (ambos)
									if( tipo == 1 || tipo == 3 )
										// agrega la alerta
										MasterCardDAO.saveNewAlertByUser( alerta , us , nombre , texto , fechaProlongada , fechaProlongada , fechaProlongada , noti , null ) ;
                                                                                
									// en caso de que sea de tipo 2 (correo) o 3 (ambos)
									if( tipo == 2 || tipo == 3 )
										MCUtil.sendMailForNotification( us.getEmail( ) , alerta.getNombre( ) , texto ) ;
								}

							}
						}
					}
//				}
			}
		}// termina else
		
		
	}
    
	public static void NotificacionParaPais( int numPaq , TblAsset asset , int tipoHabitacion , int cvePais )
		throws
			MasterCardException
	{
		System.out.println( "ThrowNotificationTypeCount" ) ;
		// averigua el tipoCuenta
//		TblTipoCuenta tipoCuenta = MasterCardDAO.findCountTypeById( cveCountType ) ;
                TblPaises Pais = MasterCardDAO.getPaisesByCve( cvePais ) ;
                
		
		// en caso de que no exista
		if( Pais == null )
			throw new MasterCardException( 
					MCUtil.messages.getString( "com.mastercard.assets.web.modules.notification.errors.CountTypeNotExist" , cvePais ) ,
					MCUtil.MASTERCARD_ERROR_CODE_NOTIFICATION_COUNT_TYPE_NOT_EXIST , 
					null ) ;
		
		// tipo de habitacion
		String habitacion = "" ;
		
		if( tipoHabitacion == 1 )
			habitacion = "Sencilla" ;
		else
			habitacion = "Doble" ;
		
		System.out.println( "ThrowNotificationTypeCount: " + habitacion ) ;
		Timestamp fechaProlongada = new Timestamp( System.currentTimeMillis( ) + ( 1000 * 60 * 60 * 24 * 365 ) ) ;
		
			// busca las Notificaciones para NKA
			List< TblNotificacion > notis = MasterCardDAO.getAllActiveNotificationsByTipoNotificacion( 10 ) ;
                        
			
			System.out.println( "ThrowNotificationTypeCount: notis " + notis.size( ) ) ;
			// recorre las notificaciones
			for( TblNotificacion noti : notis )
			{
				
                            //validar notificacion activa
                            if ( noti.getStatus() == 0 )
                                    continue ;
                            
                                // toma los datos				
				int tipo = noti.getTipo( ) ;
				
				// alerta
				TblAlerta alerta = noti.getTblAlerta( ) ;
				// mensaje de la alerta
				String texto = alerta.getTexto( ) ;
				
				String nombre = alerta.getNombre( ) ;
				
				texto = texto.replaceAll( "<Num_Paq>" , "" + numPaq ) ;
				texto = texto.replaceAll( "<Room_Type>" , "" + habitacion ) ;
				texto = texto.replaceAll( "<Asset_Name>" , "" + asset.getNombre( ) ) ;
                                texto = texto.replaceAll( "<Count_Name_Origin>" , "" ) ;
                                texto = texto.replaceAll( "<Room_Type>" , "" ) ;
                                texto = texto.replaceAll( "<Count_Name>" , "" ) ;
				
				// toma el rol
				TblRole role = noti.getTblRole( ) ;
				// toma el nivel
				TblNivel nivel = noti.getTblNivel( ) ;
				
				int cveRole = role.getCveRole( ) ;

					// toma los usuarios
					List< TblUsuario > usuarios = MasterCardDAO.listaDeUsuariosPorPais( cvePais ) ;
                                        
					
					// recorre los usuarios
					for( TblUsuario us : usuarios )
					{	
						// revisa los roles
						List< TblRole > roles = us.getTblRoles( ) ;
						
						boolean tieneRole = false ;
						
						for( TblRole r : roles )
						{
							if( r.getStatus( ) == 0 )
								continue ;

							// en caso de que tenga el mismo rol
							if( r.getCveRole( ) == cveRole )
							{
								tieneRole = true ;
								
								break ;
							}
						}
						
						// en caso de que este en false
						if( ! tieneRole )
							continue ;
						else
						{
							// en caso de que nivel sea null
							if( nivel == null )
							{   
                                                                System.out.println( "ThrowNotificationTypeCount: Agrega sin nivelregistro " + alerta.getCveAlerta( ) + " - " + us.getCveUsuario( ) + " - " + nombre ) ;
								// en caso de que sea de tipo 1 (Pantalla) o 3 (ambos)
								if( tipo == 1 || tipo == 3 )
									// agrega la alerta
									MasterCardDAO.saveNewAlertByUser( alerta , us , nombre , texto , fechaProlongada , fechaProlongada , fechaProlongada , noti, null ) ;
                                                                        
								// en caso de que sea de tipo 2 (correo) o 3 (ambos)
								if( tipo == 2 || tipo == 3 )
									MCUtil.sendMailForNotification( us.getEmail( ) , alerta.getNombre( ) , texto ) ;
							}
							// en caso de que no sea null
							else
							{
								int cveNivel = nivel.getCveNivel( ) ;
								
								// recorre los niveles
								List< TblNivel > niveles = us.getTblNivels( ) ;
								
								boolean tieneNivel = false ;
								
								for( TblNivel ni : niveles )
								{
									if( ni.getStatus( ) == 0 )
										continue ;
									
									if( ni.getCveNivel( ) == cveNivel )
									{
										tieneNivel = true ;
										
										break ;
									}
								}
								
								if( tieneNivel )
								{
									System.out.println( "ThrowNotificationTypeCount: Agrega registro " + alerta.getCveAlerta( ) + " - " + us.getCveUsuario( ) + " - " + nombre + " tipo: " + tipo ) ;
									// en caso de que sea de tipo 1 (Pantalla) o 3 (ambos)
									if( tipo == 1 || tipo == 3 )
										// agrega la alerta
										MasterCardDAO.saveNewAlertByUser( alerta , us , nombre , texto , fechaProlongada , fechaProlongada , fechaProlongada , noti, null ) ;
                                                                                
									// en caso de que sea de tipo 2 (correo) o 3 (ambos)
									if( tipo == 2 || tipo == 3 )
										MCUtil.sendMailForNotification( us.getEmail( ) , alerta.getNombre( ) , texto ) ;
								}

							}
						}
					}
			}
                
	}	
	
        // ESTE METODO YA NO SE USA, SON LAS NOTIFICACIONES PARA AVISAR QUE UNA CUENTA SOLICITA PAQUETES
	public static void throwNotificationTypeRequestPackage( int numPaq , int tipoHabitacion , TblAsset asset , UserLogin user )
		throws
			MasterCardException
	{
//		if( user == null )
//			return ;
//		
//		// toma todas las notificaciones de tipo
//		List< TblNotificacion > notificaciones = MasterCardDAO.getAllActiveNotificationsByTipoNotificacion( 3 ) ;
//		
//		// verifica si el tipo de cuenta tiene varias cuentas o una sola
//		List< TblCuenta > cuentasHermanas = user.getBindCounts( ) ;
//		
//		// recorre todas las notificaciones
//		for( TblNotificacion noti : notificaciones )
//		{
//                                            
//			// en caso de que no este activa
//			if( noti.getStatus( ) == 0 )
//				// siguiente
//				continue ;
//			
//			// toma los datos
//			// tipo
//			int tipo = noti.getTipo( ) ;
//			
//			// alerta
//			TblAlerta alerta = noti.getTblAlerta( ) ;
//			// mensaje de la alerta
//			String texto = alerta.getTexto( ) ;
//			
//			String nombre = alerta.getNombre( ) ;
//			
//			texto = texto.replaceAll( "<Num_Paq>" , "" + numPaq ) ;
//			texto = texto.replaceAll( "<Room_Type>" , "" + ( ( tipoHabitacion == 1 ) ? "Sencilla" : "Doble" ) ) ;
//			texto = texto.replaceAll( "<Asset_Name>" , "" + asset.getNombre( ) ) ;
//			texto = texto.replaceAll( "<Count_Name>" , "" + user.getActualCountName( ) ) ;
//                        texto = texto.replaceAll( "<Campaign_Name>" , "" ) ;
//                        texto = texto.replaceAll( "<Count_Name_Origin>" , "" ) ;
//			
//			Timestamp fechaProlongada = new Timestamp( System.currentTimeMillis( ) + ( 1000 * 60 * 60 * 24 * 365 ) ) ;
//			
//			// toma el rol
//			TblRole role = noti.getTblRole( ) ;
//			// toma el nivel
//			TblNivel nivel = noti.getTblNivel( ) ;
//			
//			int cveRole = role.getCveRole( ) ;
//			
//			// recorre las cuentas
//			for( TblCuenta c : cuentasHermanas )
//			{
//				if( c.getStatus( ) == 0 )
//					continue ;
//				
//				// toma los usuarios
//				List< TblUsuario > usuarios = c.getTblUsuarios( ) ;
//				
//				System.out.println( "ThrowNotificationTypeCount: usuarios " + usuarios.size( ) ) ;
//				// recorre los usuarios
//				for( TblUsuario us : usuarios )
//				{
//					// en caso de que no este activo
//					if( us.getStatus( ) == 0 )
//						continue ;
//					
//					// revisa los roles
//					List< TblRole > roles = us.getTblRoles( ) ;
//					
//					boolean tieneRole = false ;
//					
//					System.out.println( "ThrowNotificationTypeCount: roles " + roles.size( ) ) ;
//					for( TblRole r : roles )
//					{
//						if( r.getStatus( ) == 0 )
//							continue ;
//						
//						System.out.println( "ThrowNotificationTypeCount: comparacion " + r.getCveRole( ) + " - " + cveRole ) ;
//						// en caso de que tenga el mismo rol
//						if( r.getCveRole( ) == cveRole )
//						{
//							tieneRole = true ;
//							
//							break ;
//						}
//					}
//					
//					System.out.println( "ThrowNotificationTypeCount: tieneRole " + tieneRole ) ;
//					// en caso de que este en false
//					if( ! tieneRole )
//						continue ;
//					else
//					{
//						// en caso de que nivel sea null
//						if( nivel == null )
//						{
//							System.out.println( "ThrowNotificationTypeCount: Agrega registro " + alerta.getCveAlerta( ) + " - " + us.getCveUsuario( ) + " - " + nombre ) ;
//							
//							// en caso de que sea de tipo 1 (Pantalla) o 3 (ambos)
//							if( tipo == 1 || tipo == 3 )
//								// agrega la alerta en pantalla
//								MasterCardDAO.saveNewAlertByUser( alerta , us , nombre , texto , fechaProlongada , fechaProlongada , fechaProlongada ,  noti , c ) ;
//							// en caso de que sea de tipo 2 (correo) o 3 (ambos)
//							if( tipo == 2 || tipo == 3 )
//								MCUtil.sendMailForNotification( us.getEmail( ) , alerta.getNombre( ) , texto ) ;
//						}
//						// en caso de que no sea null
//						else
//						{
//							int cveNivel = nivel.getCveNivel( ) ;
//							
//							// recorre los niveles
//							List< TblNivel > niveles = us.getTblNivels( ) ;
//							
//							boolean tieneNivel = false ;
//							
//							for( TblNivel ni : niveles )
//							{
//								if( ni.getStatus( ) == 0 )
//									continue ;
//								
//								if( ni.getCveNivel( ) == cveNivel )
//								{
//									tieneNivel = true ;
//									
//									break ;
//								}
//							}
//							
//							System.out.println( "ThrowNotificationTypeCount: Agrega registro " + alerta.getCveAlerta( ) + " - " + us.getCveUsuario( ) + " - " + nombre ) ;
//							if( tieneNivel )
//							{
//								// en caso de que sea de tipo 1 (Pantalla) o 3 (ambos)
//								if( tipo == 1 || tipo == 3 )
//									// agrega la alerta en pantalla
//									MasterCardDAO.saveNewAlertByUser( alerta , us , nombre , texto , fechaProlongada , fechaProlongada , fechaProlongada , noti , c ) ;
//								// en caso de que sea de tipo 2 (correo) o 3 (ambos)
//								if( tipo == 2 || tipo == 3 )
//									MCUtil.sendMailForNotification( us.getEmail( ) , alerta.getNombre( ) , texto ) ;
//							}
//
//						}
//					}
//				}
//			}
//			
//		}
	}
	// ESTE METODO YA NO SE USA, SON LAS NOTIFICACIONES PARA AVISAR QUE UNA CUENTA RECHAZO LA SOLICITUD DE PAQUETES DE OTRA
	public static void throwNotificationTypeRejectPackage( int numPaq , int tipoHabitacion , TblAsset asset , UserLogin user , TblCuenta cuentaOrigen )
		throws
			MasterCardException
	{
//		if( user == null )
//			return ;
//		
//		// toma todas las notificaciones de tipo
//		List< TblNotificacion > notificaciones = MasterCardDAO.getAllActiveNotificationsByTipoNotificacion( 4 ) ;
//		
//		// verifica si el tipo de cuenta tiene varias cuentas o una sola
//		List< TblCuenta > cuentasHermanas = user.getBindCounts( ) ;
//		
//		// recorre todas las notificaciones
//		for( TblNotificacion noti : notificaciones )
//		{           
//                        // en caso de que no este activa
//			if( noti.getStatus( ) == 0 )
//				// siguiente
//				continue ;
//			
//			// toma los datos
//			// tipo
//			int tipo = noti.getTipo( ) ;
//			
//			// alerta
//			TblAlerta alerta = noti.getTblAlerta( ) ;
//			// mensaje de la alerta
//			String texto = alerta.getTexto( ) ;
//			
//			String nombre = alerta.getNombre( ) ;
//			
//			texto = texto.replaceAll( "<Count_Name_Origin>" , "" + ( ( cuentaOrigen == null ) ? "" : cuentaOrigen.getNombre( ) ) ) ;
//			texto = texto.replaceAll( "<Room_Type>" , "" + ( ( tipoHabitacion == 1 ) ? "Sencilla" : "Doble" ) ) ;
//			texto = texto.replaceAll( "<Asset_Name>" , "" + asset.getNombre( ) ) ;
//			texto = texto.replaceAll( "<Count_Name>" , "" + user.getActualCountName( ) ) ;
//			texto = texto.replaceAll( "<Num_Paq>" , "" ) ;
//			texto = texto.replaceAll( "<Campaign_Name>" , "" ) ;
//			
//			Timestamp fechaProlongada = new Timestamp( System.currentTimeMillis( ) + ( 1000 * 60 * 60 * 24 * 365 ) ) ;
//			
//			// toma el rol
//			TblRole role = noti.getTblRole( ) ;
//			// toma el nivel
//			TblNivel nivel = noti.getTblNivel( ) ;
//			
//			int cveRole = role.getCveRole( ) ;
//			
//			// recorre las cuentas
//			for( TblCuenta c : cuentasHermanas )
//			{
//				if( c.getStatus( ) == 0 )
//					continue ;
//				
//				// toma los usuarios
//				List< TblUsuario > usuarios = c.getTblUsuarios( ) ;
//				
//				System.out.println( "ThrowNotificationTypeCount: usuarios " + usuarios.size( ) ) ;
//				// recorre los usuarios
//				for( TblUsuario us : usuarios )
//				{
//					// en caso de que no este activo
//					if( us.getStatus( ) == 0 )
//						continue ;
//					
//					// revisa los roles
//					List< TblRole > roles = us.getTblRoles( ) ;
//					
//					boolean tieneRole = false ;
//					
//					System.out.println( "ThrowNotificationTypeCount: roles " + roles.size( ) ) ;
//					for( TblRole r : roles )
//					{
//						if( r.getStatus( ) == 0 )
//							continue ;
//						
//						System.out.println( "ThrowNotificationTypeCount: comparacion " + r.getCveRole( ) + " - " + cveRole ) ;
//						// en caso de que tenga el mismo rol
//						if( r.getCveRole( ) == cveRole )
//						{
//							tieneRole = true ;
//							
//							break ;
//						}
//					}
//					
//					System.out.println( "ThrowNotificationTypeCount: tieneRole " + tieneRole ) ;
//					// en caso de que este en false
//					if( ! tieneRole )
//						continue ;
//					else
//					{
//						// en caso de que nivel sea null
//						if( nivel == null )
//						{
//							System.out.println( "ThrowNotificationTypeCount: Agrega registro " + alerta.getCveAlerta( ) + " - " + us.getCveUsuario( ) + " - " + nombre ) ;
//							
//							// en caso de que sea de tipo 1 (Pantalla) o 3 (ambos)
//							if( tipo == 1 || tipo == 3 )
//								// agrega la alerta en pantalla
//								MasterCardDAO.saveNewAlertByUser( alerta , us , nombre , texto , fechaProlongada , fechaProlongada , fechaProlongada , noti , c ) ;
//							// en caso de que sea de tipo 2 (correo) o 3 (ambos)
//							if( tipo == 2 || tipo == 3 )
//								MCUtil.sendMailForNotification( us.getEmail( ) , alerta.getNombre( ) , texto ) ;
//						}
//						// en caso de que no sea null
//						else
//						{
//							int cveNivel = nivel.getCveNivel( ) ;
//							
//							// recorre los niveles
//							List< TblNivel > niveles = us.getTblNivels( ) ;
//							
//							boolean tieneNivel = false ;
//							
//							for( TblNivel ni : niveles )
//							{
//								if( ni.getStatus( ) == 0 )
//									continue ;
//								
//								if( ni.getCveNivel( ) == cveNivel )
//								{
//									tieneNivel = true ;
//									
//									break ;
//								}
//							}
//							
//							System.out.println( "ThrowNotificationTypeCount: Agrega registro " + alerta.getCveAlerta( ) + " - " + us.getCveUsuario( ) + " - " + nombre ) ;
//							if( tieneNivel )
//							{
//								// en caso de que sea de tipo 1 (Pantalla) o 3 (ambos)
//								if( tipo == 1 || tipo == 3 )
//									// agrega la alerta en pantalla
//									MasterCardDAO.saveNewAlertByUser( alerta , us , nombre , texto , fechaProlongada , fechaProlongada , fechaProlongada , noti , c ) ;
//								// en caso de que sea de tipo 2 (correo) o 3 (ambos)
//								if( tipo == 2 || tipo == 3 )
//									MCUtil.sendMailForNotification( us.getEmail( ) , alerta.getNombre( ) , texto ) ;
//							}
//
//						}
//					}
//				}
//			}
//			
//		}
	}
	
	public static void throwNotificationTypeAuthorizePackage( int numPaq , int tipoHabitacion , TblAsset asset , UserLogin user , TblCuenta cuentaOrigen )
		throws
			MasterCardException
	{
		if( user == null )
			return ;
		
		// toma todas las notificaciones de tipo
		List< TblNotificacion > notificaciones = MasterCardDAO.getAllActiveNotificationsByTipoNotificacion( 5 ) ;
                
		
		// verifica si el tipo de cuenta tiene varias cuentas o una sola
//		List< TblCuenta > cuentasHermanas = user.getBindCounts( ) ;
		
		// recorre todas las notificaciones
		for( TblNotificacion noti : notificaciones )
		{
			// en caso de que no este activa
			if( noti.getStatus( ) == 0 )
				// siguiente
				continue ;
			
			// toma los datos
			// tipo
			int tipo = noti.getTipo( ) ;
			
			// alerta
			TblAlerta alerta = noti.getTblAlerta( ) ;
			// mensaje de la alerta
			String texto = alerta.getTexto( ) ;
			
			String nombre = alerta.getNombre( ) ;
			
			texto = texto.replaceAll( "<Count_Name_Origin>" , "" + ( ( cuentaOrigen == null ) ? "" : cuentaOrigen.getNombre( ) ) ) ;
			texto = texto.replaceAll( "<Room_Type>" , "" + ( ( tipoHabitacion == 1 ) ? "Sencilla" : "Doble" ) ) ;
			texto = texto.replaceAll( "<Asset_Name>" , "" + asset.getNombre( ) ) ;
			texto = texto.replaceAll( "<Count_Name>" , "" + user.getActualCountName( ) ) ;
                        texto = texto.replaceAll("<Num_Paq>", "" + numPaq ) ;
			texto = texto.replaceAll( "<Campaign_Name>" , "" ) ;
			
			Timestamp fechaProlongada = new Timestamp( System.currentTimeMillis( ) + ( 1000 * 60 * 60 * 24 * 365 ) ) ;
			
			// toma el rol
			TblRole role = noti.getTblRole( ) ;
			// toma el nivel
			TblNivel nivel = noti.getTblNivel( ) ;
			
			int cveRole = role.getCveRole( ) ;
			
				// toma los usuarios
				List< TblUsuario > usuarios = cuentaOrigen.getTblUsuarios( ) ;
				
				System.out.println( "ThrowNotificationTypeCount: usuarios " + usuarios.size( ) ) ;
				// recorre los usuarios
				for( TblUsuario us : usuarios )
				{
					// en caso de que no este activo
					if( us.getStatus( ) == 0 )
						continue ;
                                        
                                        if( us.getTblPais( ) != asset.getTblPais( ) )
                                            continue ;
					
					// revisa los roles
					List< TblRole > roles = us.getTblRoles( ) ;
					
					boolean tieneRole = false ;
					
					System.out.println( "ThrowNotificationTypeCount: roles " + roles.size( ) ) ;
					for( TblRole r : roles )
					{
						if( r.getStatus( ) == 0 )
							continue ;
						
						System.out.println( "ThrowNotificationTypeCount: comparacion " + r.getCveRole( ) + " - " + cveRole ) ;
						// en caso de que tenga el mismo rol
						if( r.getCveRole( ) == cveRole )
						{
							tieneRole = true ;
							
							break ;
						}
					}
					
					System.out.println( "ThrowNotificationTypeCount: tieneRole " + tieneRole ) ;
					// en caso de que este en false
					if( ! tieneRole )
						continue ;
					else
					{
						// en caso de que nivel sea null
						if( nivel == null )
						{
							System.out.println( "ThrowNotificationTypeCount: Agrega registro " + alerta.getCveAlerta( ) + " - " + us.getCveUsuario( ) + " - " + nombre ) ;
							
							// en caso de que sea de tipo 1 (Pantalla) o 3 (ambos)
							if( tipo == 1 || tipo == 3 )
								// agrega la alerta en pantalla
								MasterCardDAO.saveNewAlertByUser( alerta , us , nombre , texto , fechaProlongada , fechaProlongada , fechaProlongada , noti , cuentaOrigen ) ;
                                                                
							// en caso de que sea de tipo 2 (correo) o 3 (ambos)
							if( tipo == 2 || tipo == 3 )
								MCUtil.sendMailForNotification( us.getEmail( ) , alerta.getNombre( ) , texto ) ;
						}
						// en caso de que no sea null
						else
						{
							int cveNivel = nivel.getCveNivel( ) ;
							
							// recorre los niveles
							List< TblNivel > niveles = us.getTblNivels( ) ;
							
							boolean tieneNivel = false ;
							
							for( TblNivel ni : niveles )
							{
								if( ni.getStatus( ) == 0 )
									continue ;
								
								if( ni.getCveNivel( ) == cveNivel )
								{
									tieneNivel = true ;
									
									break ;
								}
							}
							
							System.out.println( "ThrowNotificationTypeCount: Agrega registro " + alerta.getCveAlerta( ) + " - " + us.getCveUsuario( ) + " - " + nombre ) ;
							if( tieneNivel )
							{
								// en caso de que sea de tipo 1 (Pantalla) o 3 (ambos)
								if( tipo == 1 || tipo == 3 )
									// agrega la alerta en pantalla
									MasterCardDAO.saveNewAlertByUser( alerta , us , nombre , texto , fechaProlongada , fechaProlongada , fechaProlongada , noti , cuentaOrigen ) ;
                                                                        
								// en caso de que sea de tipo 2 (correo) o 3 (ambos)
								if( tipo == 2 || tipo == 3 )
									MCUtil.sendMailForNotification( us.getEmail( ) , alerta.getNombre( ) , texto ) ;
							}

						}
					}
				}			
		}
	}
        
        public static void throwNotificationTypeReturnsPackage( int numPaq , int tipoHabitacion , TblAsset asset , UserLogin user , TblCuenta cuentaOrigen, EntityTransaction et )
		throws
			MasterCardException
	{
		if( user == null )
			return ;
		
		// toma todas las notificaciones de tipo
		List< TblNotificacion > notificaciones = MasterCardDAO.getAllActiveNotificationsByTipoNotificacion( 12 ) ;
		
		// verifica si el tipo de cuenta tiene varias cuentas o una sola
//		List< TblCuenta > cuentasHermanas = user.getBindCounts( ) ;
		
		// recorre todas las notificaciones
		for( TblNotificacion noti : notificaciones )
		{           
                        // en caso de que no este activa
			if( noti.getStatus( ) == 0 )
				// siguiente
				continue ;
			
			// toma los datos
			// tipo
			int tipo = noti.getTipo( ) ;
			
			// alerta
			TblAlerta alerta = noti.getTblAlerta( ) ;
			// mensaje de la alerta
			String texto = alerta.getTexto( ) ;
			
			String nombre = alerta.getNombre( ) ;
			
			texto = texto.replaceAll( "<Count_Name_Origin>" , "" + ( ( cuentaOrigen == null ) ? "" : cuentaOrigen.getNombre( ) ) ) ;
			texto = texto.replaceAll( "<Room_Type>" , "" + ( ( tipoHabitacion == 1 ) ? "Sencilla" : "Doble" ) ) ;
			texto = texto.replaceAll( "<Asset_Name>" , "" + asset.getNombre( ) ) ;
			texto = texto.replaceAll( "<Count_Name>" , "" + user.getActualCountName( ) ) ;
			texto = texto.replaceAll( "<Num_Paq>" , "" + numPaq ) ;
			texto = texto.replaceAll( "<Campaign_Name>" , "" ) ;
			
			Timestamp fechaProlongada = new Timestamp( System.currentTimeMillis( ) + ( 1000 * 60 * 60 * 24 * 365 ) ) ;
			
			// toma el rol
			TblRole role = noti.getTblRole( ) ;
			// toma el nivel
			TblNivel nivel = noti.getTblNivel( ) ;
			
			int cveRole = role.getCveRole( ) ;
			
			// recorre las cuentas
//			for( TblCuenta c : cuentasHermanas )
//			{
//				if( c.getStatus( ) == 0 )
//					continue ;
				
				// toma los usuarios
				List< TblUsuario > usuarios = MasterCardDAO.getAllActiveUsersFromRoleAndLevel(role, nivel);// c.getTblUsuarios( ) ;
				
				System.out.println( "ThrowNotificationTypeCount: usuarios " + usuarios.size( ) ) ;
				// recorre los usuarios
				for( TblUsuario us : usuarios )
				{
					// en caso de que no este activo
					if( us.getStatus( ) == 0 )
						continue ;
					
					// revisa los roles
					List< TblRole > roles = us.getTblRoles( ) ;
					
					boolean tieneRole = false ;
					
					System.out.println( "ThrowNotificationTypeCount: roles " + roles.size( ) ) ;
					for( TblRole r : roles )
					{
						if( r.getStatus( ) == 0 )
							continue ;
						
						System.out.println( "ThrowNotificationTypeCount: comparacion " + r.getCveRole( ) + " - " + cveRole ) ;
						// en caso de que tenga el mismo rol
						if( r.getCveRole( ) == cveRole )
						{
							tieneRole = true ;
							
							break ;
						}
					}
					
					System.out.println( "ThrowNotificationTypeCount: tieneRole " + tieneRole ) ;
					// en caso de que este en false
					if( ! tieneRole )
						continue ;
					else
					{
						// en caso de que nivel sea null
						if( nivel == null )
						{
							System.out.println( "ThrowNotificationTypeCount: Agrega registro " + alerta.getCveAlerta( ) + " - " + us.getCveUsuario( ) + " - " + nombre ) ;
							
							// en caso de que sea de tipo 1 (Pantalla) o 3 (ambos)
							if( tipo == 1 || tipo == 3 )
								// agrega la alerta en pantalla
								MasterCardDAO.saveNewAlertByUser( alerta , us , nombre , texto , fechaProlongada , fechaProlongada , fechaProlongada , et, noti , null ) ;
							// en caso de que sea de tipo 2 (correo) o 3 (ambos)
							if( tipo == 2 || tipo == 3 )
								MCUtil.sendMailForNotification( us.getEmail( ) , alerta.getNombre( ) , texto ) ;
						}
						// en caso de que no sea null
						else
						{
							int cveNivel = nivel.getCveNivel( ) ;
							
							// recorre los niveles
							List< TblNivel > niveles = us.getTblNivels( ) ;
							
							boolean tieneNivel = false ;
							
							for( TblNivel ni : niveles )
							{
								if( ni.getStatus( ) == 0 )
									continue ;
								
								if( ni.getCveNivel( ) == cveNivel )
								{
									tieneNivel = true ;
									
									break ;
								}
							}
							
							System.out.println( "ThrowNotificationTypeCount: Agrega registro " + alerta.getCveAlerta( ) + " - " + us.getCveUsuario( ) + " - " + nombre ) ;
							if( tieneNivel )
							{
								// en caso de que sea de tipo 1 (Pantalla) o 3 (ambos)
								if( tipo == 1 || tipo == 3 )
									// agrega la alerta en pantalla
									MasterCardDAO.saveNewAlertByUser( alerta , us , nombre , texto , fechaProlongada , fechaProlongada , fechaProlongada , et, noti , null ) ;
								// en caso de que sea de tipo 2 (correo) o 3 (ambos)
								if( tipo == 2 || tipo == 3 )
									MCUtil.sendMailForNotification( us.getEmail( ) , alerta.getNombre( ) , texto ) ;
							}

						}
					}
				}
//			}
			
		}
	}
	
	public static void throwNotificationTypeGenerateCampaign( UserLogin user , TblCampania campania )
		throws
			MasterCardException
	{
		if( user == null )
			return ;
		
		// toma todas las notificaciones de tipo
		List< TblNotificacion > notificaciones = MasterCardDAO.getAllActiveNotificationsByTipoNotificacion( 6 ) ;
                
		
		// recorre todas las notificaciones
		for( TblNotificacion noti : notificaciones )
		{
			// en caso de que no este activa
			if( noti.getStatus( ) == 0 )
				// siguiente
				continue ;
			
			// toma los datos
			// tipo
			int tipo = noti.getTipo( ) ;
			
			// alerta
			TblAlerta alerta = noti.getTblAlerta( ) ;
			// mensaje de la alerta
			String texto = alerta.getTexto( ) ;
			
			String nombre = alerta.getNombre( ) ;
			
			texto = texto.replaceAll( "<Campaign_Name>" , "" + campania.getNombre( ) ) ;
			texto = texto.replaceAll( "<Count_Name>" , "" + user.getActualCountName( ) ) ;
                        texto = texto.replaceAll( "<Num_Paq>" , "" ) ;
			texto = texto.replaceAll( "<Campaign_Name>" , "" ) ;
			texto = texto.replaceAll( "<Asset_Name>" , "" ) ;
			texto = texto.replaceAll( "<Room_Type>" , "" ) ;
			
			Timestamp fechaProlongada = new Timestamp( System.currentTimeMillis( ) + ( 1000 * 60 * 60 * 24 * 365 ) ) ;
			
			// toma el rol
			TblRole role = noti.getTblRole( ) ;
			// toma el nivel
			TblNivel nivel = noti.getTblNivel( ) ;
			
			int cveRole = role.getCveRole( ) ;
			
			// toma todos los usuarios del rol 2
			List< TblUsuario > users = MasterCardDAO.getAllActiveUsersFromRoleAndLevel( role , nivel ) ;
                        
			
			// recorre las cuentas
			for( TblUsuario us : users )
			{
				// en caso de que no este activo
				if( us.getStatus( ) == 0 )
					continue ;
                                
                                if( us.getTblPais( ) != campania.getTblPaquetes( ).get( 0 ).getTblAsset( ).getTblPais( ) )
                                    continue ;
				
				// en caso de que sea de tipo 1 (Pantalla) o 3 (ambos)
				if( tipo == 1 || tipo == 3 )
					// agrega la alerta en pantalla
					MasterCardDAO.saveNewAlertByUser( alerta , us , nombre , texto , fechaProlongada , fechaProlongada , fechaProlongada , noti , null ) ;
                                        
				// en caso de que sea de tipo 2 (correo) o 3 (ambos)
				if( tipo == 2 || tipo == 3 )
					MCUtil.sendMailForNotification( us.getEmail( ) , alerta.getNombre( ) , texto ) ;
				//}
			}// fin del for de usuarios			
		}
	}
	
	public static void throwNotificationTypeGenerateCampaign( TblCampania campania , EntityTransaction et , int rolMF )
		throws
			MasterCardException
	{	
		// toma todas las notificaciones de tipo
		List< TblNotificacion > notificaciones = MasterCardDAO.getAllActiveNotificationsByTipoNotificacion( 6 ) ;
                
		
		// recorre todas las notificaciones
		for( TblNotificacion noti : notificaciones )
		{
			// en caso de que no este activa
			if( noti.getStatus( ) == 0 )
				// siguiente
				continue ;
			
			// toma los datos
			// tipo
			int tipo = noti.getTipo( ) ;
			
			// alerta
			TblAlerta alerta = noti.getTblAlerta( ) ;
			// mensaje de la alerta
			String texto = alerta.getTexto( ) ;
			
			String nombre = alerta.getNombre( ) ;
			
			texto = texto.replaceAll( "<Campaign_Name>" , "" + campania.getNombre( ) ) ;
			texto = texto.replaceAll( "<Count_Name_Origin>" , "" + campania.getTblCuenta( ).getTblTipoCuenta( ).getNombre( ) ) ;
			texto = texto.replaceAll( "<Count_Name>" , "" + campania.getTblCuenta( ).getNombre( ) ) ;
			texto = texto.replaceAll( "<Room_Type>" , "" ) ;
			texto = texto.replaceAll( "<Num_Paq>" , ""  ) ;
			texto = texto.replaceAll( "<Asset_Name>" , "" ) ;
                        
			
			Timestamp fechaProlongada = new Timestamp( System.currentTimeMillis( ) + ( 1000 * 60 * 60 * 24 * 365 ) ) ;
			
			// toma el rol
			TblRole role = null ;
                        // si trae rolMF(rol de microflujo) valida la notificacion
                        if(rolMF > 0 )
                        {
                            //Si la notificacion no es para CM continua el ciclo de notificaciones
                            if( noti.getTblRole( ).getCveRole( ) != 2 )
                                continue ;
                            
                            // Asigna el rol enviado por el Microflujo
                            role = MasterCardDAO.findRoleById( rolMF ) ;
                            
                        }else{
                            role = noti.getTblRole( ) ;
                        }
                        
			// toma el nivel
			TblNivel nivel = noti.getTblNivel( ) ;
			
			// toma todos los usuarios del rol 2
			List< TblUsuario > users = MasterCardDAO.getAllActiveUsersFromRoleAndLevel( role , nivel ) ;
                        
			int usCuentaId = campania.getTblCuenta( ).getCveCuenta( ) ;
			// recorre las cuentas
			for( TblUsuario us : users )
			{                            
				// en caso de que no este activo
				if( us.getStatus( ) == 0 )
					continue ;
                                
                                if( role.getCveRole( ) != 6 && role.getCveRole( ) != 7 && role.getCveRole( ) != 8 )
                                {
                                    if( us.getTblPais( ) != campania.getTblPaquetes( ).get( 0 ).getTblAsset( ).getTblPais( ) )
                                        continue ;
                                }
                                
				
				List< TblCuenta > cuen = us.getTblCuentas( ) ;
                             if( role.getCveRole( ) == 2 || role.getCveRole( ) == 6 || role.getCveRole( ) == 7 || role.getCveRole( ) == 8 )
                            {
                                // si la notificacion es para CM no valida la cuenta
                               // en caso de que sea de tipo 1 (Pantalla) o 3 (ambos)
				if( tipo == 1 || tipo == 3 )
					// agrega la alerta en pantalla
					MasterCardDAO.saveNewAlertByUser( alerta , us , nombre , texto , fechaProlongada , fechaProlongada , fechaProlongada , et , noti , null ) ;
                                        
				// en caso de que sea de tipo 2 (correo) o 3 (ambos)
				if( tipo == 2 || tipo == 3 )
					MCUtil.sendMailForNotification( us.getEmail( ) , alerta.getNombre( ) , texto ) ;
                                
                            }else if(  role.getCveRole( ) == 5 )
                            {
                                
                                TblTipoCuenta tc = us.getTblTipoCuentas( ).get( 0 ) ;
                                
                                if( tc != campania.getTblCuenta( ).getTblTipoCuenta( ) )
                                    continue ;
                                
                                // en caso de que sea de tipo 1 (Pantalla) o 3 (ambos)
				if( tipo == 1 || tipo == 3 )
					// agrega la alerta en pantalla
					MasterCardDAO.saveNewAlertByUser( alerta , us , nombre , texto , fechaProlongada , fechaProlongada , fechaProlongada , et , noti , null ) ;
                                        
				// en caso de que sea de tipo 2 (correo) o 3 (ambos)
				if( tipo == 2 || tipo == 3 )
					MCUtil.sendMailForNotification( us.getEmail( ) , alerta.getNombre( ) , texto ) ;
                                
                            }else{
                                 // para cualquier otro rol que no sea CM
                                 for ( TblCuenta c : cuen ) {
                                    if ( c.getStatus( ) == 0 )
                                        continue;
                                if( usCuentaId == c.getCveCuenta( ) )
                                {
                                    
                                // en caso de que sea de tipo 1 (Pantalla) o 3 (ambos)
				if( tipo == 1 || tipo == 3 )
					// agrega la alerta en pantalla
					MasterCardDAO.saveNewAlertByUser( alerta , us , nombre , texto , fechaProlongada , fechaProlongada , fechaProlongada , et , noti , c ) ;
                                        
				// en caso de que sea de tipo 2 (correo) o 3 (ambos)
				if( tipo == 2 || tipo == 3 )
					MCUtil.sendMailForNotification( us.getEmail( ) , alerta.getNombre( ) , texto ) ;
                                }
                                    
                                }
                             }                                
                                
			}// fin del for de usuarios
			
		}
	}
	
	public static void throwNotificationTypeRejectCampaign( TblCampania campania , int ope , EntityTransaction et )
		throws
			MasterCardException
	{
		// toma todas las notificaciones de tipo
            List< TblNotificacion > notificaciones = new ArrayList< TblNotificacion >() ;
            if(ope == 0){                
		notificaciones = MasterCardDAO.getAllActiveNotificationsByTipoNotificacion( 7 ) ;
            }else if(ope==2){
		notificaciones = MasterCardDAO.getAllActiveNotificationsByTipoNotificacion( 9 ) ;
            }
		
		// recorre todas las notificaciones
		for( TblNotificacion noti : notificaciones )
		{
			// en caso de que no este activa
			if( noti.getStatus( ) == 0 )
				// siguiente
				continue ;
			
			// toma los datos
			// tipo
			int tipo = noti.getTipo( ) ;
			
			// alerta
			TblAlerta alerta = noti.getTblAlerta( ) ;
			// mensaje de la alerta
			String texto = alerta.getTexto( ) ;
			
			String nombre = alerta.getNombre( ) ;
			
			texto = texto.replaceAll( "<Campaign_Name>" , "" + campania.getNombre( ) ) ;
                        texto = texto.replaceAll( "<Count_Name_Origin>" , "" ) ;
			texto = texto.replaceAll( "<Room_Type>" , "" ) ;
			texto = texto.replaceAll( "<Asset_Name>" , "" ) ;
			texto = texto.replaceAll( "<Count_Name>" , "" + campania.getTblCuenta( ).getNombre( ) ) ;
                        texto = texto.replaceAll("<Num_Paq>", "" + campania.getTblPaquetes( ).size( ) ) ;
			
			Timestamp fechaProlongada = new Timestamp( System.currentTimeMillis( ) + ( 1000 * 60 * 60 * 24 * 365 ) ) ;
			
			// toma el rol
			TblRole role = noti.getTblRole( ) ;
			// toma el nivel
			TblNivel nivel = noti.getTblNivel( ) ;
			
			int cveRole = role.getCveRole( ) ;
                        
                        List< TblUsuario > users = new ArrayList< TblUsuario >( ) ;
                        TblCuenta cuenta = campania.getTblCuenta( ) ;
                        
                        
                        if ( cveRole == 2 || cveRole == 6 || cveRole == 7 || cveRole == 8  ){
                            // toma todos los usuarios del rol 2
                            users = role.getTblUsuarios( ) ;
                            
                                // recorre las cuentas
			for( TblUsuario us : users )
			{
				// en caso de que no este activo
				if( us.getStatus( ) == 0 )
					continue ;
                                
                                if( cveRole == 2 )
                                {
                                    if( us.getTblPais( ) != campania.getTblPaquetes( ).get( 0 ).getTblAsset( ).getTblPais( ) )
                                        continue ;
                                }
                                
                                
				// revisa los roles
				List< TblRole > roles = us.getTblRoles( ) ;
				
				boolean tieneRole = false ;
				
				System.out.println( "ThrowNotificationTypeCount: roles " + roles.size( ) ) ;
				for( TblRole r : roles )
				{
					if( r.getStatus( ) == 0 )
						continue ;
					
					System.out.println( "ThrowNotificationTypeCount: comparacion " + r.getCveRole( ) + " - " + cveRole ) ;
					// en caso de que tenga el mismo rol
					if( r.getCveRole( ) == cveRole )
					{
						tieneRole = true ;
						
						break ;
					}
				}
				
				System.out.println( "ThrowNotificationTypeCount: tieneRole " + tieneRole ) ;
				// en caso de que este en false
				if( ! tieneRole )
					continue ;
				else
				{
					// en caso de que nivel sea null
					if( nivel == null )
					{
						// en caso de que sea de tipo 1 (Pantalla) o 3 (ambos)
						if( tipo == 1 || tipo == 3 )
							// agrega la alerta en pantalla
							MasterCardDAO.saveNewAlertByUser( alerta , us , nombre , texto , fechaProlongada , fechaProlongada , fechaProlongada , et , noti , null ) ;
                                                        
						// en caso de que sea de tipo 2 (correo) o 3 (ambos)
						if( tipo == 2 || tipo == 3 )
							MCUtil.sendMailForNotification( us.getEmail( ) , alerta.getNombre( ) , texto ) ;
					}
					// en caso de que no sea null
					else
					{
						int cveNivel = nivel.getCveNivel( ) ;
						
						// recorre los niveles
						List< TblNivel > niveles = us.getTblNivels( ) ;
						
						boolean tieneNivel = false ;
						
						for( TblNivel ni : niveles )
						{
							if( ni.getStatus( ) == 0 )
								continue ;
							
							if( ni.getCveNivel( ) == cveNivel )
							{
								tieneNivel = true ;
								
								break ;
							}
						}
						
						System.out.println( "ThrowNotificationTypeCount: Agrega registro " + alerta.getCveAlerta( ) + " - " + us.getCveUsuario( ) + " - " + nombre ) ;
						if( tieneNivel )
						{
							// en caso de que sea de tipo 1 (Pantalla) o 3 (ambos)
							if( tipo == 1 || tipo == 3 )
								// agrega la alerta en pantalla
								MasterCardDAO.saveNewAlertByUser( alerta , us , nombre , texto , fechaProlongada , fechaProlongada , fechaProlongada , et , noti , null ) ;
                                                                
							// en caso de que sea de tipo 2 (correo) o 3 (ambos)
							if( tipo == 2 || tipo == 3 )
								MCUtil.sendMailForNotification( us.getEmail( ) , alerta.getNombre( ) , texto ) ;
						}

					}
				}
//                            }   
				
			}// fin del for de usuarios
                            
                        }else{
                            // toma todos los usuarios de la cuenta relacionada con la campaña
			users = MasterCardDAO.getAllActiveUsersFromCount( cuenta ) ;
                        
                        
                        // recorre las cuentas
			for( TblUsuario us : users )
			{
				// en caso de que no este activo
				if( us.getStatus( ) == 0 )
					continue ;
                                
                                if( us.getTblPais( ) != campania.getTblPaquetes( ).get( 0 ).getTblAsset( ).getTblPais( ) )
                                        continue ;
                                
				// revisa los roles
				List< TblRole > roles = us.getTblRoles( ) ;
				
				boolean tieneRole = false ;
				
				System.out.println( "ThrowNotificationTypeCount: roles " + roles.size( ) ) ;
				for( TblRole r : roles )
				{
					if( r.getStatus( ) == 0 )
						continue ;
					
					System.out.println( "ThrowNotificationTypeCount: comparacion " + r.getCveRole( ) + " - " + cveRole ) ;
					// en caso de que tenga el mismo rol
					if( r.getCveRole( ) == cveRole )
					{
						tieneRole = true ;
						
						break ;
					}
				}
				
				System.out.println( "ThrowNotificationTypeCount: tieneRole " + tieneRole ) ;
				// en caso de que este en false
				if( ! tieneRole )
					continue ;
				else
				{
					// en caso de que nivel sea null
					if( nivel == null )
					{
						// en caso de que sea de tipo 1 (Pantalla) o 3 (ambos)
						if( tipo == 1 || tipo == 3 )
							// agrega la alerta en pantalla
							MasterCardDAO.saveNewAlertByUser( alerta , us , nombre , texto , fechaProlongada , fechaProlongada , fechaProlongada , et , noti , cuenta ) ;
                                                        
						// en caso de que sea de tipo 2 (correo) o 3 (ambos)
						if( tipo == 2 || tipo == 3 )
							MCUtil.sendMailForNotification( us.getEmail( ) , alerta.getNombre( ) , texto ) ;
					}
					// en caso de que no sea null
					else
					{
						int cveNivel = nivel.getCveNivel( ) ;
						
						// recorre los niveles
						List< TblNivel > niveles = us.getTblNivels( ) ;
						
						boolean tieneNivel = false ;
						
						for( TblNivel ni : niveles )
						{
							if( ni.getStatus( ) == 0 )
								continue ;
							
							if( ni.getCveNivel( ) == cveNivel )
							{
								tieneNivel = true ;
								
								break ;
							}
						}
						
						System.out.println( "ThrowNotificationTypeCount: Agrega registro " + alerta.getCveAlerta( ) + " - " + us.getCveUsuario( ) + " - " + nombre ) ;
						if( tieneNivel )
						{
							// en caso de que sea de tipo 1 (Pantalla) o 3 (ambos)
							if( tipo == 1 || tipo == 3 )
								// agrega la alerta en pantalla
								MasterCardDAO.saveNewAlertByUser( alerta , us , nombre , texto , fechaProlongada , fechaProlongada , fechaProlongada , et , noti , cuenta ) ;
                                                                
							// en caso de que sea de tipo 2 (correo) o 3 (ambos)
							if( tipo == 2 || tipo == 3 )
								MCUtil.sendMailForNotification( us.getEmail( ) , alerta.getNombre( ) , texto ) ;
						}

					}
				}
//                            }   
				
			}// fin del for de usuarios
                        
                        }
		}
	}
	
	public static void throwNotificationTypeAuthorizeCampaign( TblCampania campania )
		throws
			MasterCardException
	{
		// toma todas las notificaciones de tipo
		List< TblNotificacion > notificaciones = MasterCardDAO.getAllActiveNotificationsByTipoNotificacion( 8 ) ;
                
		
		// recorre todas las notificaciones
		for( TblNotificacion noti : notificaciones )
		{
			// en caso de que no este activa
			if( noti.getStatus( ) == 0 )
				// siguiente
				continue ;
			
			// toma los datos
			// tipo
			int tipo = noti.getTipo( ) ;
			
			// alerta
			TblAlerta alerta = noti.getTblAlerta( ) ;
			// mensaje de la alerta
			String texto = alerta.getTexto( ) ;
			
			String nombre = alerta.getNombre( ) ;
			
			texto = texto.replaceAll( "<Campaign_Name>" , "" + campania.getNombre( ) ) ;
                        texto = texto.replaceAll( "<Count_Name_Origin>" , "" ) ;
			texto = texto.replaceAll( "<Room_Type>" , "" ) ;
			texto = texto.replaceAll( "<Asset_Name>" , "" ) ;
			texto = texto.replaceAll( "<Count_Name>" , ""  ) ;
                        texto = texto.replaceAll("<Num_Paq>", "" ) ;
			
			Timestamp fechaProlongada = new Timestamp( System.currentTimeMillis( ) + ( 1000 * 60 * 60 * 24 * 365 ) ) ;
			
			// toma el rol
			TblRole role = noti.getTblRole( ) ;
			// toma el nivel
			TblNivel nivel = noti.getTblNivel( ) ;
			
			int cveRole = role.getCveRole( ) ;
			
			// toma todos los usuarios del rol 2
			List< TblUsuario > users = new ArrayList< TblUsuario >( ) ;
			users.add( campania.getTblUsuario1( ) ) ;
			users.add( campania.getTblUsuario2( ) ) ;
			
			// recorre las cuentas
			for( TblUsuario us : users )
			{
                            if( us.getTblPais( ) != campania.getTblPaquetes( ).get( 0 ).getTblAsset( ).getTblPais( ) )
                                continue ;                            
                            
				// en caso de que no este activo
				if( us.getStatus( ) == 0 )
					continue ;
				
				// revisa los roles
				List< TblRole > roles = us.getTblRoles( ) ;
				
				boolean tieneRole = false ;
				
				System.out.println( "ThrowNotificationTypeCount: roles " + roles.size( ) ) ;
				for( TblRole r : roles )
				{
					if( r.getStatus( ) == 0 )
						continue ;
					
					System.out.println( "ThrowNotificationTypeCount: comparacion " + r.getCveRole( ) + " - " + cveRole ) ;
					// en caso de que tenga el mismo rol
					if( r.getCveRole( ) == cveRole )
					{
						tieneRole = true ;
						
						break ;
					}
				}
				
				System.out.println( "ThrowNotificationTypeCount: tieneRole " + tieneRole ) ;
				// en caso de que este en false
				if( ! tieneRole )
					continue ;
				else
				{
					// en caso de que nivel sea null
					if( nivel == null )
					{
						// en caso de que sea de tipo 1 (Pantalla) o 3 (ambos)
						if( tipo == 1 || tipo == 3 )
							// agrega la alerta en pantalla
							MasterCardDAO.saveNewAlertByUser( alerta , us , nombre , texto , fechaProlongada , fechaProlongada , fechaProlongada , noti , null ) ;
                                                        
						// en caso de que sea de tipo 2 (correo) o 3 (ambos)
						if( tipo == 2 || tipo == 3 )
							MCUtil.sendMailForNotification( us.getEmail( ) , alerta.getNombre( ) , texto ) ;
					}
					// en caso de que no sea null
					else
					{
						int cveNivel = nivel.getCveNivel( ) ;
						
						// recorre los niveles
						List< TblNivel > niveles = us.getTblNivels( ) ;
						
						boolean tieneNivel = false ;
						
						for( TblNivel ni : niveles )
						{
							if( ni.getStatus( ) == 0 )
								continue ;
							
							if( ni.getCveNivel( ) == cveNivel )
							{
								tieneNivel = true ;
								
								break ;
							}
						}
						
						System.out.println( "ThrowNotificationTypeCount: Agrega registro " + alerta.getCveAlerta( ) + " - " + us.getCveUsuario( ) + " - " + nombre ) ;
						if( tieneNivel )
						{
							// en caso de que sea de tipo 1 (Pantalla) o 3 (ambos)
							if( tipo == 1 || tipo == 3 )
								// agrega la alerta en pantalla
								MasterCardDAO.saveNewAlertByUser( alerta , us , nombre , texto , fechaProlongada , fechaProlongada , fechaProlongada , noti , null ) ;
                                                                
							// en caso de que sea de tipo 2 (correo) o 3 (ambos)
							if( tipo == 2 || tipo == 3 )
								MCUtil.sendMailForNotification( us.getEmail( ) , alerta.getNombre( ) , texto ) ;
						}

					}
				}
                            //}
			}// fin del for de usuarios
			
		}
	}
	
	public static void throwNotificationTypeAuthorizeCampaign( TblCampania campania , EntityTransaction et )
		throws
			MasterCardException
	{
		// toma todas las notificaciones de tipo
		List< TblNotificacion > notificaciones = MasterCardDAO.getAllActiveNotificationsByTipoNotificacion( 8 ) ;
                
		
		// recorre todas las notificaciones
		for( TblNotificacion noti : notificaciones )
		{
			// en caso de que no este activa
			if( noti.getStatus( ) == 0 )
				// siguiente
				continue ;
			
			// toma los datos
			// tipo
			int tipo = noti.getTipo( ) ;
			
			// alerta
			TblAlerta alerta = noti.getTblAlerta( ) ;
			// mensaje de la alerta
			String texto = alerta.getTexto( ) ;
			
			String nombre = alerta.getNombre( ) ;
			
			texto = texto.replaceAll( "<Count_Name>" , "" + campania.getTblCuenta().getNombre() ) ;
                        texto = texto.replaceAll("<Num_Paq>", "" + campania.getTblPaquetes( ).size( ) ) ;
                        texto = texto.replaceAll( "<Campaign_Name>" , "" + campania.getNombre( ) ) ;
                        texto = texto.replaceAll( "<Count_Name_Origin>" , "" ) ;
			texto = texto.replaceAll( "<Room_Type>" , "" ) ;
			texto = texto.replaceAll( "<Asset_Name>" , "" ) ;
			
			Timestamp fechaProlongada = new Timestamp( System.currentTimeMillis( ) + ( 1000 * 60 * 60 * 24 * 365 ) ) ;
			
			// toma el rol
			TblRole role = noti.getTblRole( ) ;
			// toma el nivel
			TblNivel nivel = noti.getTblNivel( ) ;
			
			int cveRole = role.getCveRole( ) ;
			
			// toma todos los usuarios del rol 2
			List< TblUsuario > users = new ArrayList< TblUsuario >( ) ;
                        
                        TblCuenta cuenta = campania.getTblCuenta( ) ;
                        
//                        users.add( campania.getTblUsuario1( ) ) ;
//			users.add( campania.getTblUsuario2( ) ) ;
                        
                         if ( cveRole == 2 || cveRole == 6 || cveRole == 7 || cveRole == 8 ){
                             
                             // toma todos los usuarios del rol 2
                             users = role.getTblUsuarios( ) ;
                             
                             // recorre las cuentas
			for( TblUsuario us : users )
			{
				// en caso de que no este activo
				if( us.getStatus( ) == 0 )
					continue ;
                                
                                if( cveRole == 2 )
                                {
                                    if( us.getTblPais( ) != campania.getTblPaquetes( ).get( 0 ).getTblAsset( ).getTblPais( ) )
                                        continue ;
                                }
				
				// revisa los roles
				List< TblRole > roles = us.getTblRoles( ) ;
				
				boolean tieneRole = false ;
				
				System.out.println( "ThrowNotificationTypeCount: roles " + roles.size( ) ) ;
				for( TblRole r : roles )
				{
					if( r.getStatus( ) == 0 )
						continue ;
					
					System.out.println( "ThrowNotificationTypeCount: comparacion " + r.getCveRole( ) + " - " + cveRole ) ;
					// en caso de que tenga el mismo rol
					if( r.getCveRole( ) == cveRole )
					{
						tieneRole = true ;
						
						break ;
					}
				}
				
				System.out.println( "ThrowNotificationTypeCount: tieneRole " + tieneRole ) ;
				// en caso de que este en false
				if( ! tieneRole )
					continue ;
				else
				{
                                    
                                    // en caso de que nivel sea null
					if( nivel == null )
					{
						// en caso de que sea de tipo 1 (Pantalla) o 3 (ambos)
						if( tipo == 1 || tipo == 3 )
							// agrega la alerta en pantalla
							MasterCardDAO.saveNewAlertByUser( alerta , us , nombre , texto , fechaProlongada , fechaProlongada , fechaProlongada , et , noti , null ) ;
                                                        
						// en caso de que sea de tipo 2 (correo) o 3 (ambos)
						if( tipo == 2 || tipo == 3 )
							MCUtil.sendMailForNotification( us.getEmail( ) , alerta.getNombre( ) , texto ) ;
					}
					// en caso de que no sea null
					else
					{
						int cveNivel = nivel.getCveNivel( ) ;
						
						// recorre los niveles
						List< TblNivel > niveles = us.getTblNivels( ) ;
						
						boolean tieneNivel = false ;
						
						for( TblNivel ni : niveles )
						{
							if( ni.getStatus( ) == 0 )
								continue ;
							
							if( ni.getCveNivel( ) == cveNivel )
							{
								tieneNivel = true ;
								
								break ;
							}
						}
						
						System.out.println( "ThrowNotificationTypeCount: Agrega registro " + alerta.getCveAlerta( ) + " - " + us.getCveUsuario( ) + " - " + nombre ) ;
						if( tieneNivel )
						{
							// en caso de que sea de tipo 1 (Pantalla) o 3 (ambos)
							if( tipo == 1 || tipo == 3 )
								// agrega la alerta en pantalla
								MasterCardDAO.saveNewAlertByUser( alerta , us , nombre , texto , fechaProlongada , fechaProlongada , fechaProlongada , et , noti , null ) ;
                                                                
							// en caso de que sea de tipo 2 (correo) o 3 (ambos)
							if( tipo == 2 || tipo == 3 )
								MCUtil.sendMailForNotification( us.getEmail( ) , alerta.getNombre( ) , texto ) ;
						}

					}
                                    //} 
				}
				
			}// fin del for de usuarios
                             
                             
                         }else{
                            // toma todos los usuarios de la cuenta relacionada con la campaña
                            users = MasterCardDAO.getAllActiveUsersFromCount( cuenta ) ;
                            
                            
                            // recorre las cuentas
			for( TblUsuario us : users )
			{
				// en caso de que no este activo
				if( us.getStatus( ) == 0 )
					continue ;
				
                                if( us.getTblPais( ) != campania.getTblPaquetes( ).get( 0 ).getTblAsset( ).getTblPais( ) )
                                    continue ;
                                
				// revisa los roles
				List< TblRole > roles = us.getTblRoles( ) ;
				
				boolean tieneRole = false ;
				
				System.out.println( "ThrowNotificationTypeCount: roles " + roles.size( ) ) ;
				for( TblRole r : roles )
				{
					if( r.getStatus( ) == 0 )
						continue ;
					
					System.out.println( "ThrowNotificationTypeCount: comparacion " + r.getCveRole( ) + " - " + cveRole ) ;
					// en caso de que tenga el mismo rol
					if( r.getCveRole( ) == cveRole )
					{
						tieneRole = true ;
						
						break ;
					}
				}
				
				System.out.println( "ThrowNotificationTypeCount: tieneRole " + tieneRole ) ;
				// en caso de que este en false
				if( ! tieneRole )
					continue ;
				else
				{                                    
                                    // en caso de que nivel sea null
					if( nivel == null )
					{
						// en caso de que sea de tipo 1 (Pantalla) o 3 (ambos)
						if( tipo == 1 || tipo == 3 )
							// agrega la alerta en pantalla
							MasterCardDAO.saveNewAlertByUser( alerta , us , nombre , texto , fechaProlongada , fechaProlongada , fechaProlongada , et , noti , cuenta ) ;
                                                        
						// en caso de que sea de tipo 2 (correo) o 3 (ambos)
						if( tipo == 2 || tipo == 3 )
							MCUtil.sendMailForNotification( us.getEmail( ) , alerta.getNombre( ) , texto ) ;
					}
					// en caso de que no sea null
					else
					{
						int cveNivel = nivel.getCveNivel( ) ;
						
						// recorre los niveles
						List< TblNivel > niveles = us.getTblNivels( ) ;
						
						boolean tieneNivel = false ;
						
						for( TblNivel ni : niveles )
						{
							if( ni.getStatus( ) == 0 )
								continue ;
							
							if( ni.getCveNivel( ) == cveNivel )
							{
								tieneNivel = true ;
								
								break ;
							}
						}
						
						System.out.println( "ThrowNotificationTypeCount: Agrega registro " + alerta.getCveAlerta( ) + " - " + us.getCveUsuario( ) + " - " + nombre ) ;
						if( tieneNivel )
						{
							// en caso de que sea de tipo 1 (Pantalla) o 3 (ambos)
							if( tipo == 1 || tipo == 3 )
								// agrega la alerta en pantalla
								MasterCardDAO.saveNewAlertByUser( alerta , us , nombre , texto , fechaProlongada , fechaProlongada , fechaProlongada , et , noti , cuenta ) ;
                                                                
							// en caso de que sea de tipo 2 (correo) o 3 (ambos)
							if( tipo == 2 || tipo == 3 )
								MCUtil.sendMailForNotification( us.getEmail( ) , alerta.getNombre( ) , texto ) ;
						}
					}
				}
				
			}// fin del for de usuarios
                            
                         }
		}
	}
        // fin de flujjo de implemntacion y Generacion de numero de PO
        public static void throwNotificationTypeFinalizeFlow( int numPO , TblAsset asset , UserLogin user, EntityTransaction et )
		throws
			MasterCardException
	{
		if( user == null )
			return ;
		
		// toma todas las notificaciones de tipo
		List< TblNotificacion > notificaciones = MasterCardDAO.getAllActiveNotificationsByTipoNotificacion( 11 ) ;
                
                // define la agencia
                int agencia = asset.getTblAgencia( ).getCveAgencia( ) ;
		
		
		// recorre todas las notificaciones
		for( TblNotificacion noti : notificaciones )
		{
			// en caso de que no este activa
			if( noti.getStatus( ) == 0 )
				// siguiente
				continue ;
			
			// toma los datos
			// tipo
			int tipo = noti.getTipo( ) ;
			
			// alerta
			TblAlerta alerta = noti.getTblAlerta( ) ;
			// mensaje de la alerta
			String texto = alerta.getTexto( ) ;
			
			String nombre = alerta.getNombre( ) ;
			
			texto = texto.replaceAll( "<Count_Name_Origin>" , "" ) ;
			texto = texto.replaceAll( "<Room_Type>" , "" ) ;
			texto = texto.replaceAll( "<Asset_Name>" , "" + asset.getNombre( ) ) ;
			texto = texto.replaceAll( "<Count_Name>" , "" + user.getActualCountName( ) ) ;
                        texto = texto.replaceAll("<Num_Paq>", "" ) ;
			texto = texto.replaceAll( "<Campaign_Name>" , "" ) ;
                        texto = texto.replaceAll("<Num_PO>", "" + numPO ) ;
			
			Timestamp fechaProlongada = new Timestamp( System.currentTimeMillis( ) + ( 1000 * 60 * 60 * 24 * 365 ) ) ;
			
			// toma el rol
			TblRole role = noti.getTblRole( ) ;
			// toma el nivel
			TblNivel nivel = noti.getTblNivel( ) ;
			
			int cveRole = role.getCveRole( ) ;
			
			List< TblUsuario > users = MasterCardDAO.getAllActiveUsersFromRoleAndLevel( role , nivel ) ;
                        
				
				System.out.println( "ThrowNotificationTypeCount: usuarios " + users.size( ) ) ;
				// recorre los usuarios
				for( TblUsuario us : users )
				{
					// en caso de que no este activo
					if( us.getStatus( ) == 0 )
						continue ;
                                        
                                        if( us.getTblPais( ) != asset.getTblPais( ) )
                                            continue ;
					
					// revisa los roles
					List< TblRole > roles = us.getTblRoles( ) ;
                                        
                                        // si es alerta para agencia revisa que sea la miama que la de el asset
                                                // para poder mandarla
                                                if( cveRole == 4 ) {
                                                    // intenta tomar la Agrncias del usuario
                                                    List< TblAgencia > agenciasUSR = us.getTblAgencias( ) ;
                                                    if( agenciasUSR.isEmpty( ) || agenciasUSR == null )
                                                        continue ;
                                                    
                                                    boolean tieneAgencia = false ;
                                                    // recorre las agencias de usuario
                                                    for( TblAgencia agen : agenciasUSR ) {
                                                        // en caso de que tenga la misma agencia
                                                        if( agencia == agen.getCveAgencia( )  )
                                                        {
                                                                tieneAgencia = true ;

                                                                break ;
                                                        }
                                                    }
                                                    // si no tiene la misma agencia continua el for de Usuarios
                                                    if( tieneAgencia == false )
                                                        continue;
                                                    
                                                }
					
					boolean tieneRole = false ;
					
					System.out.println( "ThrowNotificationTypeCount: roles " + roles.size( ) ) ;
					for( TblRole r : roles )
					{
						if( r.getStatus( ) == 0 )
							continue ;
						
						System.out.println( "ThrowNotificationTypeCount: comparacion " + r.getCveRole( ) + " - " + cveRole ) ;						
                                                // en caso de que tenga el mismo rol
						if( r.getCveRole( ) == cveRole )
						{
							tieneRole = true ;
							
							break ;
						}
					}
					
					System.out.println( "ThrowNotificationTypeCount: tieneRole " + tieneRole ) ;
					// en caso de que este en false
					if( ! tieneRole )
						continue ;
					else
					{
						// en caso de que nivel sea null
						if( nivel == null )
						{
							System.out.println( "ThrowNotificationTypeCount: Agrega registro " + alerta.getCveAlerta( ) + " - " + us.getCveUsuario( ) + " - " + nombre ) ;
							
							// en caso de que sea de tipo 1 (Pantalla) o 3 (ambos)
							if( tipo == 1 || tipo == 3 )
								// agrega la alerta en pantalla
								MasterCardDAO.saveNewAlertByUser( alerta , us , nombre , texto , fechaProlongada , fechaProlongada , fechaProlongada , et , noti , null ) ;
                                                                
							// en caso de que sea de tipo 2 (correo) o 3 (ambos)
							if( tipo == 2 || tipo == 3 )
								MCUtil.sendMailForNotification( us.getEmail( ) , alerta.getNombre( ) , texto ) ;
						}
						// en caso de que no sea null
						else
						{
							int cveNivel = nivel.getCveNivel( ) ;
							
							// recorre los niveles
							List< TblNivel > niveles = us.getTblNivels( ) ;
							
							boolean tieneNivel = false ;
							
							for( TblNivel ni : niveles )
							{
								if( ni.getStatus( ) == 0 )
									continue ;
								
								if( ni.getCveNivel( ) == cveNivel )
								{
									tieneNivel = true ;
									
									break ;
								}
							}
							
							System.out.println( "ThrowNotificationTypeCount: Agrega registro " + alerta.getCveAlerta( ) + " - " + us.getCveUsuario( ) + " - " + nombre ) ;
							if( tieneNivel )
							{
								// en caso de que sea de tipo 1 (Pantalla) o 3 (ambos)
								if( tipo == 1 || tipo == 3 )
									// agrega la alerta en pantalla
									MasterCardDAO.saveNewAlertByUser( alerta , us , nombre , texto , fechaProlongada , fechaProlongada , fechaProlongada , et , noti , null ) ;
                                                                        
								// en caso de que sea de tipo 2 (correo) o 3 (ambos)
								if( tipo == 2 || tipo == 3 )
									MCUtil.sendMailForNotification( us.getEmail( ) , alerta.getNombre( ) , texto ) ;
							}

						}
					}
				}			
		}
	}
}
